Творец создал Вселенную
загадочным образом. При этом он использовал десятичную систему счисления и
любил круглые цифры.
Скотт Адамс
Многие знают о
системе счисления с основанием 2 (двоичная система счисления) и практически все
знают о десятичной системе счисления (система с основанием 10), а что это за
странная база с основанием "-2"? Целое число n записанное в системе
счисления с основанием "-2" это последовательность цифр (bi), записанных справа налево.
Причём каждая цифра это либо 0 либо 1 (не отрицательные цифры!), и при этом
должно выполняться равенство:
n = b0 + b1(-2) + b2(-2)2
+ b3(-2)3 + ...
Оказывается, что
любое целое число, в том числе и отрицательные числа, имеют уникальное
представление в такой системе счисления с основанием "-2". Ваша
задача - найти это представление.
Вход. В первой строке задано количество
тестов n (не более 10000). Следующие n строк содержат сами тесты, в которых
находится единственное целое число в пределах от -1000000000 до 1000000000.
Выход. Для каждого теста в отдельной строке
выведите сначала сообщение о его номере "Case #x:", а далее через
пробел представление заданного числа в системе счисления с основанием
"-2" без ведущих нулей.
Пример входа |
Пример выхода |
4 1 7 -2 0 |
Case
#1: 1 Case
#2: 11011 Case
#3: 10 Case
#4: 0 |
системы
счисления
Исходя из
равенства n = b0 + b1
* (–2) + b2 * (–2)2
+ b3 * (–2)3 +
… следует, что число n делится на –2
только если оно четное, а число n – b0 должно делиться на –2.
Если n четное, то положим b0 = 0 (если нечетное, то b0 = 1), делим n – b0
на –2, после чего рекурсивно продолжаем искать представление числа в системе счисления по
основанию –2.
Отдельно
обрабатываем случай n = 0.
Пример
Пусть n = 6. Последовательно делим n на –2 с остатком:
6 / –2 = –3,
остаток 0 Проверка: 6 =
(–3) * (–2) + 0
–3 / –2 = 2,
остаток 1 Проверка: –3 = 2
* (–2) + 1
2 / –2 = –1,
остаток 0 Проверка: 2 =
(–1) * (–2) + 0
–1 / –2 = 1,
остаток 1 Проверка: –1 = 1
* (–2) + 1
Записав впереди
1 и остатки в обратном порядке, получим запись 11010, что составляет
Читаем
количество тестов. Для каждого теста вводим значение n.
scanf("%d",&tests);
for(i = 0; i < tests; i++)
{
scanf("%d",&n);
Отдельно обрабатываем случай когда
n = 0.
if (!n)
{
printf("Case #%d: 0\n",i+1);
continue;
}
В строке s накапливаем цифры результата, инициализируем ее пустой строкой.
Пока , записываем соответствующую цифру результата bi в строку s, вычитаем из n значение bi
и делим разность n – bi на –2. То есть совершаем присваивание .
s = "";
while (n !=
1)
{
if (n % 2)
n -= 1, s += '1'; else
s += '0';
n /= -2;
}
Добавим в конец строки 1, обернем
ее и выведем на печать.
s += '1';
reverse(s.begin(),s.end());
printf("Case #%d: %s\n",i+1,s.c_str());
}